package com.dhcc;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 自动配置类，用于配置 {@link SnowflakeIdWorker} 的实例。
 * <p>
 * 该配置类通过 {@link EnableConfigurationProperties} 注解启用 {@link IdProperties}，
 * 使得配置文件中的 `workerId` 和 `datacenterId` 参数可以自动装配到 {@link IdProperties} 中。
 * </p>
 * @author liuguoting
 */
@Configuration
@EnableConfigurationProperties(IdProperties.class)
public class IdAutoConfiguration {

    private final IdProperties idProperties;

    /**
     * 构造函数，接收 {@link IdProperties} 并将其注入到该类中。
     * <p>
     * 通过此构造函数，ID 配置将从配置文件中获取并传递给本类使用。
     * </p>
     *
     * @param idProperties 包含 workerId 和 datacenterId 的属性类
     */
    public IdAutoConfiguration(IdProperties idProperties) {
        this.idProperties = idProperties;
    }

    /**
     * 定义一个 {@link SnowflakeIdWorker} 的 Bean。
     * <p>
     * 该方法通过 {@link ConditionalOnMissingBean} 注解确保只有当上下文中没有定义
     * {@link SnowflakeIdWorker} 的 Bean 时，才会创建新的实例。
     * </p>
     *
     * @return 返回一个根据配置文件中定义的 workerId 和 datacenterId 创建的 {@link SnowflakeIdWorker} 实例
     */
    @Bean
    @ConditionalOnMissingBean
    public SnowflakeIdWorker snowflakeIdWorker() {
        return new SnowflakeIdWorker(idProperties.getWorkerId(), idProperties.getDatacenterId());
    }
}